From 2a49371e070d9303b1410ee986b1245552cb6e18 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 5 Dec 2017 16:22:06 -0800 Subject: [PATCH] Start a dnd demo Nothing to see yet. --- demos/gtk-demo/demo.gresource.xml | 4 ++ demos/gtk-demo/dnd.c | 114 ++++++++++++++++++++++++++++++ demos/gtk-demo/dnd.css | 6 ++ demos/gtk-demo/meson.build | 1 + 4 files changed, 125 insertions(+) create mode 100644 demos/gtk-demo/dnd.c create mode 100644 demos/gtk-demo/dnd.css diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index c3aef049d0..4539b40499 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -151,6 +151,7 @@ cursors.c dialog.c drawingarea.c + dnd.c editable_cells.c entry_buffer.c entry_completion.c @@ -246,4 +247,7 @@ modelbutton.ui + + dnd.css + diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c new file mode 100644 index 0000000000..85a4937546 --- /dev/null +++ b/demos/gtk-demo/dnd.c @@ -0,0 +1,114 @@ +/* Drag-and-Drop + * + * I can't believe its not glade! + */ + +#include +#include +#include + +#define GTK_TYPE_DEMO_WIDGET (gtk_demo_widget_get_type ()) + +G_DECLARE_FINAL_TYPE (GtkDemoWidget, gtk_demo_widget, GTK, DEMO_WIDGET, GtkWidget) + +static GtkWidget *gtk_demo_widget_new (void); + +struct _GtkDemoWidget +{ + GtkWidget parent_instance; +}; + +G_DEFINE_TYPE (GtkDemoWidget, gtk_demo_widget, GTK_TYPE_WIDGET) + +static void +gtk_demo_widget_finalize (GObject *object) +{ + G_OBJECT_CLASS (gtk_demo_widget_parent_class)->finalize (object); +} + +static void +gtk_demo_widget_init (GtkDemoWidget *demo) +{ + gtk_widget_set_has_window (GTK_WIDGET (demo), FALSE); + +} + +static void +gtk_demo_widget_class_init (GtkDemoWidgetClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + + object_class->finalize = gtk_demo_widget_finalize; + + gtk_widget_class_set_css_name (widget_class, "demo"); +} + +static GtkWidget * +gtk_demo_widget_new (void) +{ + return g_object_new (GTK_TYPE_DEMO_WIDGET, NULL); +} + +static void +pressed_cb (GtkGesture *gesture, + int n_press, + double x, + double y, + gpointer data) +{ + GtkWidget *widget; + + if (n_press < 2) + return; + + widget = gtk_demo_widget_new (); + + gtk_fixed_put (GTK_FIXED (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture))), widget, x, y); +} + +static GtkWidget *window = NULL; + +GtkWidget * +do_dnd (GtkWidget *do_widget) +{ + if (!window) + { + GtkWidget *vbox, *fixed; + GtkGesture *multipress; + GtkCssProvider *provider; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_display (GTK_WINDOW (window), + gtk_widget_get_display (do_widget)); + gtk_window_set_title (GTK_WINDOW (window), "Drag-and-drop"); + + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + + fixed = gtk_fixed_new (); + gtk_box_pack_start (GTK_BOX (vbox), fixed); + gtk_widget_set_hexpand (fixed, TRUE); + gtk_widget_set_vexpand (fixed, TRUE); + + multipress = gtk_gesture_multi_press_new (fixed); + gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (multipress), 0); + g_signal_connect (multipress, "pressed", G_CALLBACK (pressed_cb), NULL); + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_resource (provider, "/dnd/dnd.css"); + gtk_style_context_add_provider_for_display (gdk_display_get_default (), + GTK_STYLE_PROVIDER (provider), + 800); + } + + if (!gtk_widget_get_visible (window)) + gtk_widget_show (window); + else + gtk_widget_destroy (window); + + return window; +} diff --git a/demos/gtk-demo/dnd.css b/demos/gtk-demo/dnd.css new file mode 100644 index 0000000000..e9cfd56fae --- /dev/null +++ b/demos/gtk-demo/dnd.css @@ -0,0 +1,6 @@ +demo { + background: red; + border: 1px solid black; + min-width: 30px; + min-height: 30px; +} diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index ea34ee3846..0d5744762d 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -18,6 +18,7 @@ demos = files([ 'cursors.c', 'dialog.c', 'drawingarea.c', + 'dnd.c', 'editable_cells.c', 'entry_buffer.c', 'entry_completion.c', -- 2.30.2